Covariance এবং Contravariance এর ধারণা

Generics এর মাধ্যমে Subtyping এবং Inheritance - জাভা জেনেরিক্স (Java Generics) - Java Technologies

418

জাভার জেনেরিক্সে Covariance এবং Contravariance ধারণাগুলো জেনেরিক টাইপগুলোর সাবটাইপিং সম্পর্ক নিয়ে কাজ করে। এই ধারণাগুলো টাইপ ইনহেরিটেন্সের সাথে মিল রেখে কাজ করে এবং জেনেরিক টাইপগুলোতে ফ্লেক্সিবিলিটি প্রদান করে।


Covariance

Covariance টাইপ সম্পর্কিত এমন একটি ধারণা যেখানে একটি জেনেরিক টাইপ তার সাবটাইপ গ্রহণ করতে পারে। এটি read-only অপারেশনের জন্য ব্যবহৃত হয়।

Covariance-এর জন্য Wildcards: <? extends Type>

  • <? extends Type> নির্দেশ করে যে টাইপটি Type বা তার সাবক্লাস হতে হবে।
  • Covariance সাধারণত ডেটা পড়তে ব্যবহৃত হয়, তবে নতুন ডেটা যোগ করা যায় না

উদাহরণ:

import java.util.List;
import java.util.ArrayList;

public class CovarianceExample {
    public static void printNumbers(List<? extends Number> list) {
        for (Number num : list) {
            System.out.println(num);
        }
    }

    public static void main(String[] args) {
        List<Integer> intList = new ArrayList<>();
        intList.add(10);
        intList.add(20);

        List<Double> doubleList = new ArrayList<>();
        doubleList.add(3.14);
        doubleList.add(1.23);

        printNumbers(intList);  // Works with Integer (subtype of Number)
        printNumbers(doubleList); // Works with Double (subtype of Number)
    }
}

আউটপুট:

10
20
3.14
1.23

Contravariance

Contravariance টাইপ সম্পর্কিত এমন একটি ধারণা যেখানে একটি জেনেরিক টাইপ তার সুপারটাইপ গ্রহণ করতে পারে। এটি write-only অপারেশনের জন্য ব্যবহৃত হয়।

Contravariance-এর জন্য Wildcards: <? super Type>

  • <? super Type> নির্দেশ করে যে টাইপটি Type বা তার সুপারক্লাস হতে হবে।
  • Contravariance সাধারণত ডেটা যোগ করতে ব্যবহৃত হয়, তবে ডেটা পড়া সম্ভব নয় (অবজেক্ট হিসেবে পড়া ছাড়া)।

উদাহরণ:

import java.util.List;
import java.util.ArrayList;

public class ContravarianceExample {
    public static void addNumbers(List<? super Integer> list) {
        list.add(10);
        list.add(20);
    }

    public static void main(String[] args) {
        List<Number> numberList = new ArrayList<>();
        addNumbers(numberList); // Works with Number (supertype of Integer)

        List<Object> objectList = new ArrayList<>();
        addNumbers(objectList); // Works with Object (supertype of Integer)

        System.out.println(numberList); // Output: [10, 20]
        System.out.println(objectList); // Output: [10, 20]
    }
}

আউটপুট:

[10, 20]
[10, 20]

Covariance বনাম Contravariance

AspectCovarianceContravariance
Wildcards<? extends Type><? super Type>
Subtyping DirectionAccepts subtypes of the typeAccepts supertypes of the type
UsageUsed for reading dataUsed for writing data
FlexibilityProvides flexibility in readingProvides flexibility in writing
ExampleList<? extends Number>List<? super Integer>

Covariance এবং Contravariance একত্রে ব্যবহার

import java.util.ArrayList;
import java.util.List;

public class CovarianceContravarianceExample {
    public static void processList(List<? extends Number> inputList, List<? super Number> outputList) {
        for (Number num : inputList) {
            outputList.add(num); // Writing to the output list
        }
    }

    public static void main(String[] args) {
        List<Integer> integers = new ArrayList<>();
        integers.add(10);
        integers.add(20);

        List<Object> objects = new ArrayList<>();
        
        processList(integers, objects); // Covariance for input, Contravariance for output

        System.out.println(objects); // Output: [10, 20]
    }
}

কোডের ভুলের সম্ভাব্যতা কমানোর জন্য নিয়ম

  1. Covariance (<? extends Type>) ব্যবহার করুন যখন ডেটা শুধু পড়া হবে।
  2. Contravariance (<? super Type>) ব্যবহার করুন যখন ডেটা শুধু লেখা হবে।
  3. একই সময়ে Covariance এবং Contravariance ব্যবহার করুন যখন একটি লিস্ট থেকে পড়া এবং আরেকটি লিস্টে লেখা দরকার।

জাভার জেনেরিক্সে Covariance এবং Contravariance টাইপ সাবটাইপিং পরিচালনা করার একটি কার্যকর উপায়।

  • Covariance ডেটা পড়ার জন্য কার্যকর, যেখানে টাইপের সাবক্লাসগুলোকে অনুমতি দেয়।
  • Contravariance ডেটা লেখার জন্য কার্যকর, যেখানে টাইপের সুপারক্লাসগুলোকে অনুমতি দেয়। এই ধারণাগুলো টাইপ-সেইফ এবং ফ্লেক্সিবল কোড তৈরি করতে সাহায্য করে।
Content added By
Promotion

Are you sure to start over?

Loading...